Hive产生背景及Hive是什么
Hive产生的背景
- MapReduce编程的不便性
- HDFS上的文件缺少Schema
Hive是什么
- 由Facebook开源,最初用于解决海量结构化的日志数据统计问题
- 构建在Hadoop之上的数据仓库
- Hive定义了一种类SQL查询语言: HQL(类似SQL但不完全相同)
- 通常用于进行离线数据处理(刚开始采用MapReduce )
- 底层支持多种不同的执行引擎;
【Hive底层的执行引擎有:MapReduce、Tez、Spark】
【Hive on MapReduce,Hive on Tez,Hive on Spark】 - 支持多种不同的压缩格式、存储格式以及自定义函数
【压缩:GZIP、LZO、Snappy、BZIP2..】
【存储:TextFile、SequenceFile、RCFile、ORC、Parquet】
【UDF:自定义函数】 - Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库。
为什么要使用Hive及Hive发展历程
为什么要使用Hive
- 简单、容易上手(提供了类似SQL查i言HQL)
- 为超大数据集设计的计算/存储扩展能力(MR计算, HDFS存储)
- 统一的元数据管理(可与Presto/Impala/SparkSQL等共享数据)
Hive发展历程
官方版本更新详细目录
http://hive.apache.org/downloads.html
Hive在Hadoop生态系统的位置
在HDFS和Yarn之上的
Hive VS Hadoop
Hive数据存储:Hive的数据是存储在HDFS上的,Hive的表是对HDFS上数据的映射。
Hive元数据存储:元数据存储一般在外部关系库(Mysql),与Presto Impala等共享。
Hive语句的执行过程:将HQL转换为MapReduce任务运行。
Hive VS 数据库
hive执行流程
Hive体系架构及部署架构
Hive体系架构
第一行:hive访问方式shell以及Thrift/JDBC
第二行:元数据管理(Metastore);
Drive中首先解析SQL(SQL Parser)生成逻辑执行计划,然后对逻辑执行计划进行优化(Query Optimizer),最后生成物理执行计划(Physical Plan其中包括序列化反序列化和UDF函数(SerDes和UDFs)),生成最终的执行引擎(Execution)提交到MapReduce
第三行:元数据存放的位置(MySQL);
提交到计算引擎(MapReduce)的输入输出-HDFS、HBase等
部署架构–测试环境
部署架构–生产环境
其中MySQL、ResourceManage、NameNode都要主从设备;
Hive只需要在集群中装一个或者两个作为客户端使用即可
Hive单机环境搭建
Hive下载:http://archive.cloudera.com/cdh5/cdh/5/
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz解压
1
tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app/
配置
系统环境变量(~/.bahs_profile)1
2export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH实现安装一个mysql, yum install xxx,或者tar包安装
在conf下对hive-env.sh配置
1
2
3
4
5# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/home/hadoop/app/hadoop
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/home/hadoop/app/hive/conf在conf下新建hive-site.xml配置 hive-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/sparksql?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/hive/tmp</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/hive/log</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>拷贝mysql驱动到$HIVE_HOME/lib/
初始化数据库 schematool -initSchema -dbType mysql启动hive: $HIVE_HOME/bin/hive
如果要连接hiveserver2 需要分别启动1
2hive --service metastore
hive --service hiveserver2【注意】Hive启动时报错“which: no hbase in ”
在Hive的所在的机器上添加Hbase的环境变量即可
1、编辑
1 | export HBASE_HOME=/opt/module/hbase-2.2.1 |
2、环境变量生效
1 | source ~/.bahs_profile |
Hive执行方式
1 | 直接执行: |
注意:通过jdbc客户端访问需要修改以下配置
- 修改hadoop配置文件hdfs-site.xml,表示启用webhdfs
1
2
3
4<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property> - 修改hadoop配置文件core-site.xml,表示设置可访问的用户及用户组
1
2
3
4
5
6
7
8<property>
<name>hadoop.proxyuser.XXX.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.XXX.groups</name>
<value>*</value>
</property> - 重启hdfs
- 重新启动
1
2hive --service metastore
hive --service hiveserver2 - 访问
1
2
3beeline
!connect jdbc:hive2://localhost:10000